Καλησπέρα , θα ήθελα τη γνώμη σας για το πώς πρέπει (και το αν πρεπει) να υλοποιηθεί ασύγχρονα ένα σύνολο ενεργείων που εκτελείτε στο background μιας ASP.NET 2 εφαρμογής.
Συγκεκριμένα :
Έχω κάνει register ένα HTTP Module το οποίο δημιουργεί ένα Thread και καλέι μια ρουτινα σε τακτικά χρονικά διαστήματα.
Public Class CSBkGroundWorker
Implements IHttpModule
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.InitDim t As New Thread(AddressOf SendMessages)
Dim t As New Thread(AddressOf SendScheduledMessages)
t.Start()
End Sub
' Και η Sub την οποία τρέχει(Βρισκεται μεσα στο Module)
Public Shared Sub SendScheduledMessages()
While 1
Dim MessageQueque As List(Of Messages) = New List(Of Messages)
Dim MyWebService As New MyNameSpace.WebServices.Messaging
MessageQueque=GetMessagesFromDataBase() ' Database Read
For Each Msg in MessageQueque
MyWebService.SendMessage(Msg) ' WebService Call
LogMessageToDataBase(Msg) ' Database Write
Next
Thread.Sleep(intervalminutes * 60000)
End While
End Sub
Η Παραπάνω υπορουτίνα κάνει τα εξης (Εχω απλοποιήσει το κώδικα για λόγους εμφάνισης) :
1. Δίαβάζει ενα σύνολο μηνυμάτων απο την βάση
2. Για κάθε μήνυμα :
2.a : Καλεί μια μέθοδο ενος Web Service η οποία στέλνει το μήνυμα σε κάποιο άλλο server κανοντας χρήση WebRequest (Synchronous)
2.b : Γράφει σε εναν πίνακα Log της βάσης το αποτέλεσμα που επέστρεψε το Web Service
3. Τελειώνοντας κανει Sleep το Thread για καποιο χρονικο διάστημα.
Τέλος η Μεθοδος του WebService που καλέιται είναι περίπου η εξης :
<WebMethod(MessageName:="SendMessage")> _
Public Sub SendMessage( ByRef message As Messsage)
Dim request As HttpWebRequest
Dim response As HttpWebResponse = Nothing
Dim reader As StreamReader
Dim returnHttpResponseInfo As New MessageResponseInfo
Try
returnHttpResponseInfo.Status = MessageResponseInfo.StatusEnum.StatusUNKNOWN
request = DirectCast(WebRequest.Create(message.address), HttpWebRequest) ' To message.address ειναι ενα url σε απομακρυσμένο server
request.UserAgent = "MessageService"
request.KeepAlive = False
request.Timeout = RequestTimeoutSeconds * 1000
' Get response
response = DirectCast(request.GetResponse(), HttpWebResponse)
message.result=response
End Sub
Επειδή δέν εχω ξαναδουλέψει σε ασύγχρονα patterns θα ήθελα τη γνώμη σας στα εξης :
a) Υπάρχει λόγος να γίνει η όλη διαδικασία ασύγχρονη ; Το Web Service κάνει WebRequests σε απομακρυσμένους server ειτε επειδη κλείθηκε απο το HTTPModule είτε ως αποτελεσμα μιας ενεργειας των χρηστών της εφαρμογης (δηλαδή μπορει να χρειαστει να κληθει οποιαδήποτε στιγμη απο έναν η περρισοτερους χρήστες) .Αν την ώρα που το WebService εκτελεί μια σειρά απο WebRequest (Λογω κλησης του απο το HTTP Module) , και ένας χρήστης εκτελέσει μια ενεργεια που εμπλέκει το webservice , θα χρειαστεί να περιμένει να τελείωσουν τα WebRequest απο το HTTP Module ; Η Επειδή το HttpModule τρέχει σε δικό του Thread , δεν χρειάζεται ;
b) Αν χρειάζεται να γίνει η όλη διαδικασία ασυγχρονη τότε πως θα πρέπει να υλοποιηθεί αυτο ;
1. Να γίνει όλη η Ρουτίνα SendScheduledMessages μέρος του WebService και να την καλώ Ασύγχρονα (BeginSendScheduledMessages...EndSendScheduledMessages) απο το HttpModule
2. Να γινει η κλήση της WebMethod SendMessage ασυγχρονη ;
3. Να αλλάξει η υλοποιηση της SendMessage και να κάνω τα WebRequest ασυγχρονα ;
4. Όλα τα παραπάνω ;
Ευχαριστώ και ελπίζω να μην σας μπέρδεψα